<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Redis安装及主从配置 - 残剑_ - 博客园</title>
<link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=Jsknfrse2BShd-7DrxM42RyulObn44e4JjkI6-WX6zk1"/>
<link id="MainCss" type="text/css" rel="stylesheet" href="/skins/elf/bundle-elf.css?v=m1ffdAkdU6pLIBVVhuDiKZPtpJ6BKnevg8RIbTFCGUo1"/>
<link type="text/css" rel="stylesheet" href="/blog/customcss/122373.css?v=ZFEs1GsxTsRX6SiDRhrORG3NMqU%3d"/>
<link title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/liuling/rss"/>
<link title="RSD" type="application/rsd+xml" rel="EditURI" href="http://www.cnblogs.com/liuling/rsd.xml"/>
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="http://www.cnblogs.com/liuling/wlwmanifest.xml"/>
<script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script>  
<script type="text/javascript">var currentBlogApp = 'liuling', cb_enable_mathjax=false;</script>
<script src="/bundles/blog-common.js?v=V3tkfsuahqfUzgmqZVwj2QjsxodIvgDfvPKdn8yDuMY1" type="text/javascript"></script>
</head>
<body>
<a name="top"></a>

<!--done-->
<div id="home">
<div id="header">
	<div id="blogTitle">
	<a id="lnkBlogLogo" href="http://www.cnblogs.com/liuling/"><img id="blogLogo" src="/Skins/custom/images/logo.gif" alt="返回主页" /></a>			
		
<!--done-->
<h1><a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/liuling/">残剑</a></h1>
<h2></h2>



		
	</div><!--end: blogTitle 博客的标题和副标题 -->
	<div id="navigator">
		
<ul id="navList">
<li><a id="MyLinks1_HomeLink" class="menu" href="http://www.cnblogs.com/">博客园</a></li>
<li><a id="MyLinks1_MyHomeLink" class="menu" href="http://www.cnblogs.com/liuling/">首页</a></li>
<li><a id="MyLinks1_NewPostLink" class="menu" rel="nofollow" href="http://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li>
<li><a id="MyLinks1_ContactLink" class="menu" rel="nofollow" href="http://msg.cnblogs.com/send/%E6%AE%8B%E5%89%91_">联系</a></li>
<li><a id="MyLinks1_Syndication" class="menu" href="http://www.cnblogs.com/liuling/rss">订阅</a>
<!--<a id="MyLinks1_XMLLink" class="aHeaderXML" href="http://www.cnblogs.com/liuling/rss"><img src="http://www.cnblogs.com/images/xml.gif" alt="订阅" /></a>--></li>
<li><a id="MyLinks1_Admin" class="menu" rel="nofollow" href="http://i.cnblogs.com/">管理</a></li>
</ul>
		<div class="blogStats">
			
			
<!--done-->
随笔- 131&nbsp;
文章- 3&nbsp;
评论- 205&nbsp;

			
		</div><!--end: blogStats -->
	</div><!--end: navigator 博客导航栏 -->
</div><!--end: header 头部 -->

<div id="main">
	<div id="mainContent">
	<div class="forFlow">
		
<div id="post_detail">
<!--done-->
<div id="topics">
	<div class = "post">
		<h1 class = "postTitle">
			<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/liuling/p/2014-4-19-02.html">Redis安装及主从配置</a>
		</h1>
		<div class="clear"></div>
		<div class="postBody">
			<div id="cnblogs_post_body"><div style="width: 100%; height: 35px; background-color: #2eb1e8; line-height: 35px;"><span style="color: #ffffff; font-size: 16px;"><strong>一、何为Redis</strong></span></div>
<p>　　<span style="font-size: 16px;">redis是一个key-value存储系统。和Memcached类似，它支持存储的value类型相对更多，包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作，而且这些操作都是原子性的。在此基础上，redis支持各种不同方式的排序。与memcached一样，为了保证效率，数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件，并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。 redis的出现，很大程度补偿了memcached这类keyvalue存储的不足，在部分场合可以对关系数据库起到很好的补充作用。</span></p>
<div style="width: 100%; height: 35px; background-color: #2eb1e8; line-height: 35px;"><span style="color: #ffffff; font-size: 16px;"><strong>二、安装Redis</strong></span></div>
<p><span style="font-size: 16px;"><strong>1、安装前环境说明</strong></span></p>
<p><span style="font-size: 16px;">　　楼主使用的是CentOS 6.5版本的Linux系统，IP为192.168.0.100。虚拟机工具使用的是VirtualBox。</span></p>
<p><span style="font-size: 16px;"><strong>2、下载Redis</strong></span></p>
<p><span style="font-size: 16px;">　　Redis可以到官方网站上面进行下载：<a href="http://www.redis.io/download" target="_blank">http://www.redis.io/download</a>，现在最新的稳定版已经到2.8了。</span></p>
<p><span style="font-size: 16px;">　　这里使用的是redis-2.8.8.tar.gz。</span></p>
<p><span style="font-size: 16px;"><strong>3、安装步骤</strong></span></p>
<p><span style="font-size: 16px;">　　下载redis-2.8.8.tar.gz使用ftp上传到linux系统的/opt目录下。</span></p>
<p><span style="font-size: 16px;">　　1）解压</span></p>
<p><span style="font-size: 16px;">　　　　进入linux系统的/opt目录下，执行如下命令进行解压：tar -zxvf&nbsp;redis-2.8.8.tar.gz。</span></p>
<p><span style="font-size: 16px;">　　　　解压之后会在当前目录下多出redis-2.8.8的文件夹，为了方便，我们将其改名：mv&nbsp;redis-2.8.8 redis。</span></p>
<p><span style="font-size: 16px;">　　　　解压之后Redis的目录结构如下图所示：</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;"><img src="http://images.cnitblog.com/i/420264/201404/191557148074939.jpg" alt="" /></span></p>
<p><span style="font-size: 16px;">　　2）编译与安装</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">　　进入Redis目录下的src目录下，执行make命令来编译Redis。当楼主执行编译命令的时候，编译失败了，报了&ldquo;/bin/sh: cc: command not found&rdquo;的错误。原来是楼主的linux系统木有装gcc，而Redis是C实现的，所以需要gcc来进行编译。在网上搜索之后，发现一篇帖子，按照帖子上面的步骤解决了楼主的问题，在此表示感谢！下面附上该帖子的连接：<a href="http://xueliang1yi.blog.163.com/blog/static/1145570162012102114635764/" target="_blank">http://xueliang1yi.blog.163.com/blog/static/1145570162012102114635764/</a>，有遇到该问题的朋友可以参考一下。</span></p>
<p style="margin-left: 60px;"><span style="font-size: 16px;">安装完gcc之后，依次执行如下命令即可完成Redis的安装：</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">　　　　make</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">　　　　make test &nbsp; &nbsp; //检查一下 看有没有问题</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">　　　　make install</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">　　安装完之后，会在src目录下生成几个可执行文件，分别是mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server。其中redis-server是启动Redis服务的，redis-cli是进入Redis客户端的。</span></p>
<p><span style="font-size: 16px;">　　3）配置</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">　　在Redis的根目录下面有一个配置文件redis.conf，该配置文件可以对Redis进行基本的配置，配置参数可以查看<a href="http://www.cnblogs.com/liuling/p/2014-4-19-01.html" target="_blank">《Redis配置参数说明》</a>。楼主最开始只是简单的将daemonize参数设置为yes，目的是将Redis服务设置为后台开启，这样服务开启后就不会占用当前session了。</span></p>
<p><span style="font-size: 16px;"><strong>4、测试</strong></span></p>
<p><span style="font-size: 16px;"><strong>　　</strong>安装完之后，我们来对其进行测试。</span></p>
<p><span style="font-size: 16px;">　　首先，为了方便起见，我们将src下的可执行命令全部移动到/usr/local/redis/bin/目录下，执行该命令：mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/redis/bin，然后将配置文件移动到/usr/local/redis/etc/目录下，执行该命令：mv redis.conf /usr/local/redis/etc/。</span></p>
<p><span style="font-size: 16px;">　　进入/usr/local/redis/bin/目录下执行./redis-server /usr/local/redis/etc/redis.conf命令开启Redis服务。<span style="color: #ff0000;">注意：开启redis服务需要指定配置文件，如不指定配置文件则加载默认配置文件。</span></span></p>
<p><span style="font-size: 16px;">　　开启之后我们执行netstat -tunpl | grep 6379命令来查看6379端口使用情况，如果出现下图情况，则说明6379端口已经被redis-server占用了，表示redis服务已经成功启动。</span></p>
<p><span style="font-size: 16px;"><img src="http://images.cnitblog.com/i/420264/201404/191657106508620.jpg" alt="" /></span></p>
<p><span style="font-size: 16px;">　　然后执行./redis-cli进入redis客户端，然后进行简单的set、get操作来测试一下。</span></p>
<p><span style="font-size: 16px;"><img src="http://images.cnitblog.com/i/420264/201404/191700306034200.jpg" alt="" /></span></p>
<p><span style="font-size: 16px;">　　好，到此Redis已经成功安装了。</span></p>
<div style="width: 100%; height: 35px; background-color: #2eb1e8; line-height: 35px;"><span style="color: #ffffff; font-size: 16px;"><strong>三、Redis主从配置</strong></span></div>
<p>&nbsp;　　<span style="font-size: 16px;">Redis的主从复制功能非常强大，一个master可以拥有多个slave，而一个slave又可以拥有多个slave，如此下去，形成了强大的多级服务器集群架构。下面楼主简单的进行一下配置。</span></p>
<p><span style="font-size: 16px;">　　1、上面安装好的一个Redis作为master，然后使用VirtualBox的虚拟机克隆功能将刚刚那个linux系统克隆一份作为slave，并修改其IP为192.168.0.110。</span></p>
<p><span style="font-size: 16px;">　　2、修改slave的redis配置文件：</span></p>
<p><span style="font-size: 16px;">　　　　slaveof 192.168.0.100 6379&nbsp; (映射到主服务器上)</span></p>
<p><span style="font-size: 16px;">　　　　如果master设置了验证密码，还需配置masterauth。楼主的master设置了验证密码为admin，所以配置masterauth admin。</span></p>
<p><span style="font-size: 16px;">　　配置完之后启动slave的Redis服务，OK，主从配置完成。下面测试一下：</span></p>
<p><span style="font-size: 16px;">　　在master和slave分别执行info命令，查看结果如下：</span></p>
<p><span style="font-size: 16px;">　　master:</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;"><img src="http://images.cnitblog.com/i/420264/201404/191730374786356.png" alt="" /></span></p>
<p><span style="font-size: 16px;">　　slave：</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;"><img src="http://images.cnitblog.com/i/420264/201404/191733402605850.png" alt="" /></span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">然后在master执行set age 24</span></p>
<p style="margin-left: 30px;"><span style="font-size: 16px;">在slave执行get age，看是否能得到24，如果能够得到值则说明配置成功。</span></p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info">
</div>
<div class="clear"></div>
<div id="post_next_prev"></div>
</div>


		</div>
		<div class = "postDesc">posted @ <span id="post-date">2014-04-19 17:38</span> <a href='http://www.cnblogs.com/liuling/'>残剑_</a> 阅读(<span id="post_view_count">...</span>) 评论(<span id="post_comment_count">...</span>)  <a href ="http://i.cnblogs.com/EditPosts.aspx?postid=3675339" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(3675339);return false;">收藏</a></div>
	</div>
	<script type="text/javascript">var allowComments=true,isLogined=false,cb_blogId=122373,cb_entryId=3675339,cb_blogApp=currentBlogApp,cb_blogUserGuid='bb406e7b-23ba-e111-aa3f-842b2b196315',cb_entryCreatedDate='2014/4/19 17:38:00';loadViewCount(cb_entryId);</script>
	
</div><!--end: topics 文章、评论容器-->
</div><a name="!comments"></a><div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id='comment_form' class='commentform'>
<a name='commentform'></a>
<div id='divCommentShow'></div>
<div id='comment_nav'><span id='span_refresh_tips'></span><a href='javascript:void(0);' onclick='return RefreshCommentList();' id='lnk_RefreshComments' runat='server' clientidmode='Static'>刷新评论</a><a href='#' onclick='return RefreshPage();'>刷新页面</a><a href='#top'>返回顶部</a></div>
<div id='comment_form_container'></div>
<div class='ad_text_commentbox' id='ad_text_under_commentbox'></div>
<div id='ad_t2'></div>
<div id='opt_under_post'></div>
<div id='ad_c1' class='c_ad_block'></div>
<div id='under_post_news'></div>
<div id='under_post_kb'></div>
<div id='HistoryToday' class='c_ad_block'></div>
<script type='text/javascript'>
$(function () {
    setTimeout(function () { incrementViewCount(cb_entryId); }, 50);
    deliverAdT2();
    deliverAdC1();    
    loadNewsAndKb();
    loadBlogSignature();
    LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
    GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate);
    loadOptUnderPost();
    GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);    
});
</script>
</div>


	</div><!--end: forFlow -->
	</div><!--end: mainContent 主体内容容器-->

	<div id="sideBar">
		<div id="sideBarMain">
			
<!--done-->
<div class="newsItem">
<h3 class="catListTitle">公告</h3>
	<div id="blog-news"></div><script type="text/javascript">loadBlogNews();</script>
</div>

			<div id="blog-calendar" style="display:none"></div><script type="text/javascript">loadBlogDefaultCalendar();</script>
			
			<div id="leftcontentcontainer">
				<div id="blog-sidecolumn"></div><script type="text/javascript">loadBlogSideColumn();</script>
			</div>
			
		</div><!--end: sideBarMain -->
	</div><!--end: sideBar 侧边栏容器 -->
	<div class="clear"></div>
	</div><!--end: main -->
	<div class="clear"></div>
	<div id="footer">
		
<!--done-->
Copyright &copy;2016 残剑_
	</div><!--end: footer -->
</div><!--end: home 自定义的最大容器 -->
</body>
</html>
